package com.eric.service.impl;
import cn.dev33.satoken.util.SaResult;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.util.ReUtil;
import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.eric.domain.dto.WarehouseInfoDto;
import com.eric.domain.po.Warehouseinfo;
import com.eric.mapper.WarehouseinfoMapper;
import com.eric.service.IWarehouseinfoService;
import com.eric.utils.RegUtil;
import com.github.yulichang.base.MPJBaseServiceImpl;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.List;
import java.util.Objects;

import static com.eric.utils.Constant.PAGE_CURRENT;
import static com.eric.utils.Constant.PAGE_SIZE;

/**
 * <p>
 * 仓库信息表 服务实现类
 * </p>
 *
 * @author 新哥
 * @since 2024-03-12
 */
@Service
public class WarehouseinfoServiceImpl extends MPJBaseServiceImpl<WarehouseinfoMapper, Warehouseinfo> implements IWarehouseinfoService {
    //    存放一个新的仓库信息
    @Override
    @Transactional
    public SaResult saveOneWarehouseInfoService(WarehouseInfoDto warehouseInfoDtoIn) {
        Warehouseinfo warehouseInDb = query().eq("name", warehouseInfoDtoIn.getName()).one();
        if (!BeanUtil.isEmpty(warehouseInDb)){
            return SaResult.error("仓库信息已存在");
        }

        if (BeanUtil.isEmpty(warehouseInfoDtoIn)){
            return SaResult.error("录入信息有误，请重新输入");
        }
//        把传进来的字段如果包含""或者Null,都会去掉多余的""
        WarehouseInfoDto warehouseinfoDto = trimStrNull(warehouseInfoDtoIn);

        if (warehouseinfoDto.getName()!=null){
            boolean nameNatch = ReUtil.isMatch(RegUtil.realNameRegx, warehouseinfoDto.getName());
            if (!nameNatch){
                return SaResult.error("名字格式不符合规定");
            }
        }
        if (warehouseinfoDto.getContact()!=null){
            boolean contactMach = ReUtil.isMatch(RegUtil.realNameRegx, warehouseinfoDto.getContact());
            if (!contactMach){
                return SaResult.error("名字格式不符合规定");
            }
        }
        if (warehouseinfoDto.getPhone()!=null){
            boolean phoneMach = ReUtil.isMatch(RegUtil.phoneRegex, warehouseinfoDto.getPhone());
            if (!phoneMach){
                return SaResult.error("电话号码格式不符合规定");
            }
        }
        if (warehouseinfoDto.getAddress()!=null){
            boolean addressMach = ReUtil.isMatch(RegUtil.realNameRegx, warehouseinfoDto.getAddress());
            if (!addressMach){
                return SaResult.error("文字格式不符合要求");
            }
        }


        Warehouseinfo warehouseinfo = BeanUtil.copyProperties(warehouseinfoDto, Warehouseinfo.class);
//        存进数据库
        save(warehouseinfo);

        return SaResult.ok("succeed!");
    }

    //    根据Id删除一条oneWarehouseInfo信息
    @Override
    @Transactional
    public SaResult deleteOneWarehouseInfoService(Integer id) {
        if (BeanUtil.isEmpty(id)){
            return SaResult.error("wrong");
        }
        boolean b = removeById(id);

        return b?SaResult.ok("succeed"):SaResult.error("系统中没有此项内容");
    }

    //     根据前端传来的WarehouseInfoDto修改一条信息
    @Override
    @Transactional
    public SaResult modifyOneWarehouseInfoService(WarehouseInfoDto warehouseInfoDtoIn) {
        if (BeanUtil.isEmpty(warehouseInfoDtoIn)){
            return SaResult.error("信息为空");
        }
        if (warehouseInfoDtoIn.getId()==null){
            return SaResult.error("信息错误");
        }
        Warehouseinfo warehouseinfoInDb = query().eq("name", warehouseInfoDtoIn.getName()).one();
//        如果通过仓库的name查到的对象不为空，且获取到的id和传进来的warehouseinfoDto中的id不一致，表明已经有另外一个数据仓库名一样，这样会报错
        if (!BeanUtil.isEmpty(warehouseinfoInDb)&& !Objects.equals(warehouseinfoInDb.getId(), warehouseInfoDtoIn.getId())){
            return SaResult.error("仓库名字已经在数据库中存在");
        }

//        把传进来的字段如果包含
        WarehouseInfoDto warehouseinfoDto = trimStrNull(warehouseInfoDtoIn);
        if (warehouseinfoDto.getName()!=null){
            boolean nameNatch = ReUtil.isMatch(RegUtil.realNameRegx, warehouseinfoDto.getName());
            if (!nameNatch){
                return SaResult.error("名字格式不符合规定");
            }
        }
        if (warehouseinfoDto.getContact()!=null){
            boolean contactMach = ReUtil.isMatch(RegUtil.realNameRegx, warehouseinfoDto.getContact());
            if (!contactMach){
                return SaResult.error("名字格式不符合规定");
            }
        }
        if (warehouseinfoDto.getPhone()!=null){
            boolean phoneMach = ReUtil.isMatch(RegUtil.phoneRegex, warehouseinfoDto.getPhone());
            if (!phoneMach){
                return SaResult.error("电话号码格式不符合规定");
            }
        }
        if (warehouseinfoDto.getAddress()!=null){
            boolean addressMach = ReUtil.isMatch(RegUtil.realNameRegx, warehouseinfoDto.getAddress());
            if (!addressMach){
                return SaResult.error("文字格式不符合要求");
            }
        }

        Warehouseinfo warehouseinfo = BeanUtil.copyProperties(warehouseinfoDto, Warehouseinfo.class);

        boolean b = updateById(warehouseinfo);
        return SaResult.ok();
    }

    //    查询所有仓库
    @Override
    public SaResult getAllWarehouseInfoListService(Integer pageCount,Integer pageSize) {
        if (pageCount==null){
            pageCount=PAGE_CURRENT;
        }
        if (pageSize==null){
            pageSize=PAGE_SIZE;
        }
        Page<Warehouseinfo> warehouseinfoPage = page(new Page<>(pageCount, pageSize));
        List<Warehouseinfo> warehouseinfoList = warehouseinfoPage.getRecords();
        List<WarehouseInfoDto> warehouseInfoDtoList = BeanUtil.copyToList(warehouseinfoList, WarehouseInfoDto.class);
        return SaResult.data(warehouseInfoDtoList);
    }

    //    根据Id,查询一条记录
    @Override
    public SaResult getOneWarehouseInfoListService(Integer id) {
        Warehouseinfo warehouseinfoInDb = query().eq("id", id).one();
        WarehouseInfoDto warehouseinfoDto = BeanUtil.copyProperties(warehouseinfoInDb, WarehouseInfoDto.class);
        if (BeanUtil.isEmpty(warehouseinfoDto)){
            return SaResult.error("数据库中没有此信息");
        }
        return SaResult.data(warehouseinfoDto);
    }

    @Override
    public SaResult getAllByAddressService(String address) {
        String addressTrim = StrUtil.trim(address);
        if (StrUtil.isBlank(addressTrim)){
            return SaResult.error("地址不能为空");
        }
        List<Warehouseinfo> warehouseinfoList = query()
                .like("address", addressTrim).orderByDesc("update_time")
                .list();
        List<WarehouseInfoDto> warehouseInfoDtoList = BeanUtil.copyToList(warehouseinfoList, WarehouseInfoDto.class);
        return SaResult.data(warehouseInfoDtoList);
    }

    @Override
    public SaResult getAllByNameService(String name) {
        String nameTrim = StrUtil.trim(name);
        if (StrUtil.isBlank(nameTrim)){
            return SaResult.error("姓名不能为空");
        }
        List<Warehouseinfo> warehouseinfoList = query()
                .like("name", nameTrim).orderByDesc("update_time")
                .list();
        List<WarehouseInfoDto> warehouseInfoDtoList = BeanUtil.copyToList(warehouseinfoList, WarehouseInfoDto.class);
        return SaResult.data(warehouseInfoDtoList);
    }

    @Override
    public SaResult getAllByContactService(String contact) {
        String contactTrim = StrUtil.trim(contact);
        if (StrUtil.isBlank(contactTrim)){
            return SaResult.error("联系人不能为空");
        }
        List<Warehouseinfo> warehouseinfoList = query().like("contact", contactTrim).orderByDesc("update_time")
                .list();
        List<WarehouseInfoDto> warehouseInfoDtoList = BeanUtil.copyToList(warehouseinfoList, WarehouseInfoDto.class);
        return SaResult.data(warehouseInfoDtoList);
    }

    //    检测字符串数据，如果是""就设成null，方便map不做修改
    private WarehouseInfoDto trimStrNull(WarehouseInfoDto warehouseinfoDto){
        String name =StrUtil.trim(warehouseinfoDto.getName()) ;
        if (StrUtil.isBlank(name)){
            warehouseinfoDto.setName(null);
        }
        String contact = StrUtil.trim(warehouseinfoDto.getContact()) ;
        if (StrUtil.isBlank(contact)){
            warehouseinfoDto.setContact(null);
        }
        String phone =StrUtil.trim(warehouseinfoDto.getPhone()) ;
        if (StrUtil.isBlank(phone)){
            warehouseinfoDto.setPhone(null);
        }
        String address =StrUtil.trim(warehouseinfoDto.getAddress()) ;
        if (StrUtil.isBlank(address)){
            warehouseinfoDto.setAddress(null);
        }
        return warehouseinfoDto;
    }
}
